package com.example.controller;


import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

@RestController
public class AlibabaController {

    private static final String DEFAULT_PROMPT = "你是一个博学的智能聊天助手，请根据用户提问回答！";

    private final ChatClient dashScopeChatClient;

    public AlibabaController(ChatClient.Builder chatClientBuilder) {
        this.dashScopeChatClient = chatClientBuilder
                .defaultSystem(DEFAULT_PROMPT)
                // 实现 Chat Memory 的 Advisor
                // 在使用 Chat Memory 时，需要指定对话 ID，以便 Spring AI 处理上下文。
                .defaultAdvisors(
                        new MessageChatMemoryAdvisor(new InMemoryChatMemory())
                )
                // 实现 Logger 的 Advisor
                // 你的的数据：这是 AI 模型未训练过的数据。即使模型见过类似数据，附加的上下文数据在生成响应时具有优先权。
                .defaultAdvisors(
                        new SimpleLoggerAdvisor()
                )
                // 设置 ChatClient 中 ChatModel 的 Options 参数
                .defaultOptions(
                        DashScopeChatOptions.builder()
                                .withTopP(0.7)
                                .build()
                )
                .build();
    }

    @GetMapping("springai/simple/chat")
    public String simpleChat(@RequestParam("query") String query) {
        return dashScopeChatClient.prompt(query).call().content();
    }

    @GetMapping("springai/simple/ai")
    String generation(@RequestParam("userInput") String userInput) {
        return dashScopeChatClient.prompt()
                .user(userInput)
                .call() // 向 AI 模型发送请求
                .content(); // 将 AI 模型的响应作为 String 返回
    }
    @GetMapping("springai/simple/ai2")
    ChatResponse generationtwo(@RequestParam("userInput") String userInput) {
        return dashScopeChatClient.prompt()
                .user(userInput)
                .call() // 向 AI 模型发送请求
                .chatResponse(); // 含元数据的 ChatResponse 对象
    }
    @GetMapping(value = "springai/simple/streamai", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> generationStream(@RequestParam("userInput") String userInput) {
        return dashScopeChatClient.prompt()
                .user(userInput)
                .stream()  // 注意这里调用的是 stream() 方法
                .content(); // 返回 Flux<String>
    }
    @GetMapping(value = "springai/simple/streamai2", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<ChatResponse> generationStreamtwo(@RequestParam("userInput") String userInput) {
        return dashScopeChatClient.prompt()
                .user(userInput)
                .stream()  // 注意这里调用的是 stream() 方法
                .chatResponse(); // 返回 Flux<String>
    }

    @GetMapping(value = "springai/simple/streamai3", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public void generationStreamthree(@RequestParam("userInput") String userInput) {
        dashScopeChatClient.prompt()
                .user(userInput)
                .stream()  // 注意这里调用的是 stream() 方法
                .content().subscribe(System.out::print); // 简单订阅并消费流中的字符串 流式聊天接口、实时推送系统

//        Map<String, Integer> completion = Map.of("completion", 12);
    }

    /**
     * https://docs.spring.io/spring-ai/reference/api/chatclient.html
     */


}
